#include <memlayout.h>

# vectors.S sends all traps here.
.text
.globl __alltraps
__alltraps:
	# push registers to build a trap frame
	# therefore make the stack look like a struct trapframe
	pushl %ds
	pushl %es
	pushal

	# load GD_KDATA into %ds and %es to set up data segments for kernel
	movl $GD_KDATA, %eax
	movw %ax, %ds
	movw %ax, %es

	# push %esp to pass a pointer to the trapframe as an argument to trap()
	pushl %esp

	# call trap(tf), where tf=%esp
	call trap

	# pop the pushed stack pointer
	popl %esp

	# return falls through to trapret...
.globl __trapret
__trapret:
	# restore registers from stack
	popal

	# restore %ds and %es
	popl %es
	popl %ds

	# get rid of the trap number and error code
	addl $0x8, %esp
	iret

